package com.lb.ai.common.response.code;

import com.lb.ai.common.response.IResultCode;
import lombok.Getter;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 响应码容器
 * 统一管理所有响应码模块，提供响应码的注册、查询等功能
 * 
 * 设计特点：
 * 1. 单例模式，全局唯一实例
 * 2. 线程安全，支持并发访问
 * 3. 支持动态注册新模块
 * 4. 响应码查询O(1)时间复杂度
 * 
 * 使用示例：
 * {@code
 * // 获取容器实例
 * ResultCodeContainer container = ResultCodeContainer.getInstance();
 * 
 * // 注册自定义模块
 * container.registerModule(new CustomModule());
 * 
 * // 查询响应码
 * IResultCode code = container.getCode(2101);
 * 
 * // 获取模块
 * ResultCodeModule module = container.getModule(2);
 * }
 *
 * @author LiuB
 * @since 1.0.0
 * @see ResultCodeModule
 * @see IResultCode
 */
public class ResultCodeContainer {
    
    private static final ResultCodeContainer INSTANCE = new ResultCodeContainer();
    
    /**
     * 已注册的模块列表
     */
    @Getter
    private final List<ResultCodeModule> modules;
    
    /**
     * 响应码映射表
     * key: 响应码
     * value: 响应码实例
     */
    private final Map<Integer, IResultCode> codeMap;
    
    /**
     * 私有构造函数
     * 初始化容器并注册默认模块
     */
    private ResultCodeContainer() {
        this.modules = new ArrayList<>();
        this.codeMap = new ConcurrentHashMap<>();
        // 初始化默认模块
        registerModule(new BaseModule());
        registerModule(new UserModule());
        registerModule(new BusinessModule());
        registerModule(new SystemModule());
    }
    
    /**
     * 获取容器实例
     *
     * @return 容器实例
     */
    public static ResultCodeContainer getInstance() {
        return INSTANCE;
    }
    
    /**
     * 注册响应码模块
     * 将模块中的所有响应码注册到容器中
     *
     * @param module 响应码模块
     * @throws IllegalArgumentException 当模块已存在时抛出
     */
    public void registerModule(ResultCodeModule module) {
        if (getModule(module.getModuleCode()) != null) {
            throw new IllegalArgumentException(
                String.format("模块代码 %d 已被使用", module.getModuleCode())
            );
        }
        modules.add(module);
        for (IResultCode code : module.getCodes()) {
            codeMap.put(code.getCode(), code);
        }
    }
    
    /**
     * 获取响应码
     *
     * @param code 响应码
     * @return 响应码实例，如果不存在返回null
     */
    public IResultCode getCode(int code) {
        return codeMap.get(code);
    }
    
    /**
     * 判断响应码是否存在
     *
     * @param code 响应码
     * @return 是否存在
     */
    public boolean exists(int code) {
        return codeMap.containsKey(code);
    }
    
    /**
     * 获取模块
     *
     * @param moduleCode 模块代码
     * @return 模块实例，如果不存在返回null
     */
    public ResultCodeModule getModule(int moduleCode) {
        return modules.stream()
                .filter(module -> module.getModuleCode() == moduleCode)
                .findFirst()
                .orElse(null);
    }
    
    /**
     * 判断是否为成功响应码
     *
     * @param code 响应码
     * @return 是否成功
     */
    public boolean isSuccess(int code) {
        return BaseModule.Code.SUCCESS.getCode().equals(code);
    }
} 